package com.bawei.image.loader

import android.content.Context
import android.net.Uri
import android.widget.ImageView
import com.bawei.image.IImgLoader
import com.bawei.image.ImgOptions
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import java.io.File
import java.lang.ref.SoftReference

/**
 * Author: Jason Zhang
 * Date: 2025/1/10
 * Desc: Glide图片加载器
 */
class GlideImgLoader: IImgLoader {
    override fun loadFileIntoImageView(
        ctx: Context,
        file: File,
        target: ImageView,
        option: ImgOptions
    ) {
        loadImage(ctx, file, target, option)
    }

    override fun loadUrlIntoImageView(
        ctx: Context,
        url: String,
        target: ImageView,
        option: ImgOptions
    ) {
        loadImage(ctx, url, target, option)
    }

    override fun loadResIntoImageView(
        ctx: Context,
        resId: Int,
        target: ImageView,
        option: ImgOptions
    ) {
        loadImage(ctx, resId, target, option)
    }

    override fun loadByteArrayIntoImageView(
        ctx: Context,
        byteArray: ByteArray,
        target: ImageView,
        option: ImgOptions
    ) {
        loadImage(ctx, byteArray, target, option)
    }

    override fun loadUriIntoImageView(
        ctx: Context,
        uri: Uri,
        target: ImageView,
        option: ImgOptions
    ) {
        loadImage(ctx, uri, target, option)
    }


    /**
     * 四种引用类型
     * 强引用：应用运行中，是不会被GC回收
     * 弱引用：应用运行中，只要系统GC执行，都有可能被回收
     * 软引用：应用运行中，内存不足才被GC回收（Glide内存缓存就是采用软引用）
     * 虚引用：应用运行中，形同虚设，回收都交给GC统一处理
     */
    private fun loadImage(ctx: Context, source: Any, target: ImageView, option: ImgOptions){
       var softRe =  SoftReference(ctx)
        softRe.get()?.run {
            //获取请求管理器
            var reqManager = Glide.with(this)
            //是否加载Gif图片
            if (option.isGif){
                reqManager.asGif()//还有asFile(),asBitmap(),asDrawable()
            }

            //获取请求Builder
            var reqBuilder = reqManager.load(source)

            if (option.placeImage > 0){
                reqBuilder.placeholder(option.placeImage)
            }

            if (option.errorImage > 0){
                reqBuilder.error(option.errorImage)
            }

            //是否使用内存缓存
            reqBuilder.skipMemoryCache(option.skipMemory)

            /**
             * 是否使用磁盘缓存
             * Glide磁盘缓存策略：
             * DiskCacheStrategy.NONE，代表不做磁盘缓存
             * DiskCacheStrategy.AUTOMATIC，代表Glide自由选择磁盘缓存
             * DiskCacheStrategy.RESOURCE, 代表缓存的是处理之后资源图片（图片大小为ImageView的大小）
             * DiskCacheStrategy.DATA, 代表缓存的是原图
             * DiskCacheStrategy.ALL, 代表缓存原图和处理之后图片
             */
            if (option.skipDiskCache){
                reqBuilder.diskCacheStrategy(DiskCacheStrategy.NONE)
            }else{
                reqBuilder.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
            }

            //设置图片大小
            if (option.imgSize.size == 2){
                reqBuilder.submit(option.imgSize[0], option.imgSize[1])
            }

            //设置圆形图片
            if (option.isCircle){
                //Java中使用“...”代表可以传递多个同类型的参数， Kotlin中使用vararg关键字来修饰参数，代表可以传递多个同类型参数
                reqBuilder.transform(CenterCrop(), CircleCrop())
            } else {
                reqBuilder.transform(CenterCrop())
            }

            //设置图片圆角
            if (option.roundRadius > 0){
                reqBuilder.transform(CenterCrop(), RoundedCorners(option.roundRadius))
            }

            //加载ImageView组件
            reqBuilder.into(target)

        }

    }
}